#ifndef __ANALYZEFILESYSTEM_H__
#define __ANALYZEFILESYSTEM_H__

#include <stdio.h>
#include <stdlib.h>

#define BLOCK_SIZE 1024

//  超级块结构体
typedef struct {
    // 确保这些字段在结构体中的定义与磁盘上的布局相匹配
    unsigned int s_inodes_count;        // i节点总数
    unsigned int s_blocks_count;        // i块总数
    unsigned int s_r_blocks_count;      // 保留块数
    unsigned int s_free_blocks_count;   // 空闲快数
    unsigned int s_free_inodes_count;   // 空闲i节点数
    unsigned int s_first_block;         // 起始块号
    unsigned int s_log_block_size;      // 块的大小
    unsigned int s_log_frag_size;       // 片段的大小
    unsigned int s_blocks_per_group;    // 每组中块数
    unsigned int s_frags_per_group;     // 每组中i
    unsigned int s_inodes_per_group;    // 每组中i节点数
    unsigned int   s_mtime;             // 最后挂载时间
    unsigned int   s_wtime;             // 最后写入时间
    unsigned short s_mnt_count;         // 挂载计数
    short          s_max_mnt_count;     // 最大挂载计数
    unsigned short s_magic;             // Magic signature
    unsigned short s_state;             // 文件系统状态
    unsigned short s_errors;            // 行为方式
    unsigned short s_minor_rev_level;   // 次要修订级别
    unsigned int   s_lastcheck;         // 最后检查时间
    unsigned int   s_checkinterval;     // 检查间隔
    unsigned int   s_creator_os;        // 操作系统
    unsigned int   s_rev_level;         // 修订级别
    unsigned short s_def_resuid;        // 默认的保留用户ID
    unsigned short s_def_resgid;        // 默认的保留组ID
    unsigned int   s_first_ino;         // 第一个非保留的inode
    unsigned short s_inode_size;        // inode的大小
}ext3_super_block;

//  组描述符结构体
typedef struct {
    unsigned int bg_block_bitmap;       // 块位图所在块的块号
    unsigned int bg_inode_bitmap;       // i节点位图所在块的块号
    unsigned int bg_inode_table;        // i节点表所在块的块号
    unsigned short bg_free_blocks_count;// 空闲块数
    unsigned short bg_free_inodes_count;// 空闲i节点数
    unsigned short bg_used_dirs_count;  // 目录数
    unsigned short bg_pad;
    unsigned int bg_reserved[3];
}ext3_group_desc;

//  索引节点结构体
typedef struct {
    unsigned short i_mode;              // 文件模式
    unsigned short i_uid;               // 所有者用户ID
    unsigned int i_size;                // 大小（以字节为单位）
}ext3_inode;


//  解析超级块
void parse_superblock(FILE *, ext3_super_block *);
//  读取超级块
size_t read_gdt(FILE *, ext3_super_block *, ext3_group_desc **);
//  解析块位图
void parse_block_bitmap(FILE *, ext3_super_block *, ext3_group_desc *, int);
//  解析inode位图
void parse_inode_bitmap(FILE *, ext3_super_block *, ext3_group_desc *, int);



#endif